#include <iostream>
#include <string.h>
#include <vector>
#include "ticket.hpp"

using namespace std;

vector<int> number;     //  年龄记录
bool Check_flag;

int ExtractNumber(std::string str)
{
    number.clear();
    int final_price;
    size_t begin = 0, end = 0;

    if(str.empty()){
        cout << "输入有误" << endl;
        return 0;
    }

    while(end != std::string::npos) //std::string::npos是一个常量，它等于size_t类型可以表示的最大值，用来表示一个不存在的位置,类型一般是std::container_type::size_type。
    {
        begin = str.find_first_of("0123456789", end); //查找并返回第一个出现数字字符（包含于"0123456789"）的位置，如果没找到就返回string::nops
        if(begin != std::string::npos) // we found one
        {
            end = str.find_first_not_of("0123456789", begin); //查找并返回第一个不是数字字符的位置
            string num = str.substr(begin, end - begin); //提取两个位置之间的子字符串
            number.push_back(atoi(num.c_str())); //将数字字符串转成整型
            // printf("ExtractResolution number : %d\n", number);
        }
        else
            break;
    }
    if(number.size() == 0){
        printf("ExtractResolution no number in string: %s\n",str.c_str());   
        Check_flag = false;
        return 0;  
    }

    cout << "size of number: " << number.size() << endl;

    Check_flag = judge_deal();
    int age = get_real_age();
    final_price = get_price(age);

    return final_price;
}

bool judge_deal(){
    if(number.size() > 3){
        cout << "输入有误" << endl;
        return false;
    }
    else if(number.size() < 3){
        number.resize(3, 1);    //  默认无输入的值置1
    }

    if(number[1] > 12){
        cout << "日期不符合真实情况" << endl;
        return false;
    }
    if(number[2] > 31){
            cout << "日期不符合真实情况" << endl;
            return false;
        }


    if(number[0] > YEAR_NOW){
        cout << "年龄不符合真实情况" << endl;
        return false;
    }
    else if(number[0] == YEAR_NOW){
        if(number[1] > MONTH_NOW){
            cout << "年龄不符合真实情况" << endl;
            return false;
        }
        else if(number[1] == MONTH_NOW){
            if(number[2] > DAY_NOW){
                cout << "年龄不符合真实情况" << endl;
                return false;
            }
        }
    }

    if((YEAR_NOW - number[0]) > 150){
        cout << "年龄不符合真实情况或未输入出生年份" << endl;
        return false;
    }

    return true;
}

int get_real_age(){
    int age = 0;
    if(MONTH_NOW > number[1]){
        age++;
    }
    else if(MONTH_NOW == number[1]){
        if(DAY_NOW >= number[2]){
            age++;
        }
    }
    age = YEAR_NOW - number[0] + age -1;
    return age;
}

int get_price(int age){
    int price;
    if((age < 13) || (age >= 61)){
        price = 0;
    }
    else if((age < 19) && (age >= 13)){
        price = THE_PRICE / 2;
    }
    else if((age < 61) && (age >= 51)){
        price = THE_PRICE / 2;
    }
    else{
        price = THE_PRICE;
    }
    return price;
}